const express = require("express");
const fs = require("fs");
const jwt = require("jsonwebtoken");
const readData = require("./db/module/readData");
const secretKey = "Aa2317770710"; // 生成token的密钥
// 创建Express的服务器实例
const app = express();
// 使用这个中间件来解析 URL 编码格式的请求体
app.use(
  express.urlencoded({
    extended: true,
    limit: "50mb",
    parameterLimit: 50000,
    charset: "utf-8",
  })
);

app.use(express.json({ limit: "50mb", charset: "utf-8" }));

// 校验token中间件
const authenticateJWT = async (req, res, next) => {

  // 不校验token的请求白名单
  let whiteList = [];

  let result = await readData(
    { page: 1, size: 1000, isNext: true },
    "whiteList"
  );

  result.data.forEach((item) => {
    whiteList.push(item.InterfaceAddress);
  });

  // 白名单校验
  if (whiteList.includes(req.originalUrl) || req.originalUrl == "/api/login") {
    next();
    return;
  }

  // 获取请求头
  const token = req.headers.token;

  if (!token) {
    res.sendStatus(403);
    return;
  }

  jwt.verify(token, secretKey, (err, user) => {
    if (err) {
      return res.sendStatus(403); // 如果 token 无效，则返回 403 Forbidden
    }

    req.user = user; // 将解码后的 token 附加到请求对象上，以便后续中间件或路由处理器使用
    next(); // 调用 next() 以继续处理请求
  });
};

app.use(authenticateJWT);

// 获取所有api文件夹里面的文件,并且注册所有接口

function registerRoutes(prefix) {
  const fullPath = require('path').join(__dirname, prefix);
  const apiFiles = fs.readdirSync(fullPath);
  for (let i = 0; i < apiFiles.length; i++) {


    let item = apiFiles[i];
    // 判断当前循环的文件 是文件还是文件夹
    let isDistory = fs.statSync(`${prefix}/${item}`).isDirectory();
    if (isDistory) {
      // 文件夹
      registerRoutes(`${prefix}/${item}`)
    } else {
      // 判断指定路径的文件 是文件还是文件夹
      let file = require(`${prefix}/${item}`);
      app.use("/api", file); //注册全集中间件 ， 上下文是 /api
    }
  }
}

registerRoutes('./routes')


module.exports = app;
